package com.mdxq.mall.user.controller;

import cn.hutool.core.collection.CollUtil;
import com.mdxq.mall.response.R;
import com.mdxq.mall.user.service.*;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import org.springframework.web.bind.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import com.mdxq.mall.user.entity.Role;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

/**
 * 后台用户角色表 控制层。
 *
 * @author zxr
 * @since 2025-01-12
 */
@RestController
@RequestMapping("/api/v1/role")
public class RoleController {

    @Autowired
    private RoleService roleService;

    /**
     * 添加后台用户角色表。
     *
     * @param role 后台用户角色表
     * @return {@code true} 添加成功，{@code false} 添加失败
     */
    @PostMapping("save")
    public R save(@RequestBody Role role) {
        role.setCreateTime(LocalDateTime.now());//设置创建事件为当前系统时间
        if(roleService.save(role)){
            return R.ok(true);
        }
        return R.error();
    }

    /**
     * 根据主键删除后台用户角色表。
     *
     * @param ids 主键
     * @return {@code true} 删除成功，{@code false} 删除失败
     */
    @DeleteMapping ("delete")
    public R remove(@RequestParam String ids) {
        return R.ok(roleService.removeByIds(Arrays.asList(ids.split(","))));
    }

    /**
     * 根据主键更新后台用户角色表。
     *
     * @param role 后台用户角色表
     * @return {@code true} 更新成功，{@code false} 更新失败
     */
    @PutMapping("update/{id}")
    public R update(@PathVariable Long id, @RequestBody Role role) {
        if(roleService.updateById(role)){
            return R.ok(true);
        }
        return R.error();
    }

    /**
     * 更新角色的状态
     * @param id
     * @param status
     * @return
     */
    @PostMapping("updateStatus/{id}")
    public R updateStatus(@PathVariable Long id,@RequestParam int status){
        Role role = roleService.getById(id);

        if(role != null){
            role.setStatus(status);
            if(roleService.updateById(role)){
                return R.ok(true);
            }
        }
        return R.error();
    }

    /**
     * 查询所有后台用户角色表。
     *
     * @return 所有数据
     */
    @GetMapping("list")
    public R list() {
        return R.ok(roleService.list());
    }

    @Autowired
    private MenuService menuService;
    @Autowired
    private ResourceService resourceService;
    @Autowired
    private RoleMenuRelationService relationService;
    @Autowired
    private RoleResourceRelationService relationService2;
    /**
     *
     * @param roleId
     * @return
     */
    @GetMapping("listMenu/{roleId}")
    public R listMenu(@PathVariable Long roleId){
        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.eq("role_id",roleId);//role_id=?
        queryWrapper.select("menu_id"); // select menu_id
        List<Long> menuIds = relationService.listAs(queryWrapper,Long.class);// from ums_role_menu_relation
        // 如果这个角色已经分配过菜单，就查询并返回
        if(CollUtil.isNotEmpty(menuIds)){
            return R.ok(menuService.listByIds(menuIds));
        }else {  // 如果这个角色未分配过菜单，就返回一个空集合
            return R.ok(Collections.emptyList());
        }

    }

    /**
     *
     * @param roleId
     * @return
     */

    @GetMapping("listResource/{roleId}")
    public R listResource(@PathVariable Long roleId){
        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.eq("role_id",roleId);
        queryWrapper.select("resource_id");
        List<Long> resourceIds = relationService2.listAs(queryWrapper,Long.class);
        if(CollUtil.isNotEmpty(resourceIds)){
            return R.ok(resourceService.listByIds(resourceIds));
        }else {
            return R.ok(Collections.emptyList());
        }
    }
    /**
     * 根据后台用户角色表主键获取详细信息。
     *
     * @param id 后台用户角色表主键
     * @return 后台用户角色表详情
     */
    @GetMapping("getInfo/{id}")
    public Role getInfo(@PathVariable Long id) {
        return roleService.getById(id);
    }

    /**
     * 分页查询后台用户角色表。
     *
     * @param page 分页对象
     * @return 分页对象
     */
    @GetMapping("page")
    public R page(Page<Role> page, String keyword) {
        QueryWrapper queryWrapper = new QueryWrapper();
        queryWrapper.like("name",keyword);
        return R.ok(roleService.page(page,queryWrapper));
    }

    /**
     * 给角色分配有权访问的菜单
     * @param roleId
     * @param menuIds
     * @return
     */
    @PostMapping("allocMenu")
    public R allocMenu(@RequestParam Long roleId,@RequestParam String menuIds){
        return R.ok(roleService.allocMenu(roleId,menuIds));
    }

    /**
     *
     * @param roleId
     * @param resourceIds
     * @return
     */
    @PostMapping("allocResource")
    public R allocResource(@RequestParam Long roleId,@RequestParam String resourceIds){
        return R.ok(roleService.allocResource(roleId,resourceIds));
    }

}
